package com.architecture.view;

import java.lang.reflect.InvocationTargetException;
import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import com.archtecture.control.enums.Mensagem;
import com.archtecture.control.exceptions.NegocioException;
import com.sgv.model.utils.TabelaErrosMySql;

public final class UtilWeb {

	public static void enviarMensagem(MensagemEnum pMensagem) {
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(pMensagem.getSeverity(), obterTextoMensagem(NomeProperties.MENSAGENS, pMensagem), null));
	}

	public static String obterTextoMensagem(NomeProperties pNomeProperties, MensagemEnum pIdMensagem) {
		return ResourceBundle.getBundle(pNomeProperties.name().toLowerCase()).getString(pIdMensagem.getSigla());
	}

	public static void tratarException(Exception e) {

		// UtilException.obterMensagemException(e);

		if (e instanceof NegocioException) {
			tratarException((NegocioException) e);
		}
		
		else{
			
//			if (e.getClass().getName().equals("com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException")) {
//
//
//					Integer lVendorCode = Integer.parseInt(e.getClass().getMethod("getErrorCode").invoke(e).toString());
//					TabelaErrosMySql lErrosMySql = TabelaErrosMySql.valueOf(lVendorCode);
//
//					if (lErrosMySql != null) {
//						tratarException()
//					}
//					else {
//						return new NegocioException(Mensagem.ERRO_AMBIENTE);
//					}l3

		}

		UtilWeb.enviarMensagem(MensagemEnum.ERRO_AMBIENTE);
	}

	public static void tratarException(NegocioException e) {

		if (e.getMensagemErro() != null) {
			UtilWeb.enviarMensagem(MensagemEnum.valueOf(e.getMensagemErro().toString()));
		}
		else {
			UtilWeb.enviarMensagem(MensagemEnum.ERRO_AMBIENTE);
		}

	}

	private NegocioException tratarException(Throwable pErro, String pModel) {

		if (pErro.getClass().getName().equals("com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException")) {

			try {

				Integer lVendorCode = Integer.parseInt(pErro.getClass().getMethod("getErrorCode").invoke(pErro).toString());
				TabelaErrosMySql lErrosMySql = TabelaErrosMySql.valueOf(lVendorCode);

				if (lErrosMySql != null) {
					return new NegocioException(lErrosMySql.getMensagemNegocio());
				}
				else {
					return new NegocioException(Mensagem.ERRO_AMBIENTE);
				}

			}
			catch (NumberFormatException e1) {
				return new NegocioException(Mensagem.ERRO_AMBIENTE, e1);
			}
			catch (IllegalArgumentException e1) {
				return new NegocioException(Mensagem.ERRO_AMBIENTE, e1);
			}
			catch (SecurityException e1) {
				return new NegocioException(Mensagem.ERRO_AMBIENTE, e1);
			}
			catch (IllegalAccessException e1) {
				return new NegocioException(Mensagem.ERRO_AMBIENTE, e1);
			}
			catch (InvocationTargetException e1) {
				return new NegocioException(Mensagem.ERRO_AMBIENTE, e1);
			}
			catch (NoSuchMethodException e1) {
				return new NegocioException(Mensagem.ERRO_AMBIENTE, e1);
			}
		}
		else {
			if (pErro.getCause() != null) {
				return tratarException(pErro.getCause(), pModel);
			}
			else {
				return new NegocioException(Mensagem.ERRO_AMBIENTE);
			}
		}
	}
}
